function Cat(name, color) {
    this.name = name;
    this.color = color;

    // // 写在这里的 需要共享的属性：浪费内存，不能复用
    // // 需要指向一个新的，构造函数之外的内存空间
    // this.type = '猫科动物';// 不会改变的属性
    // this.eat = function () {
    //     console.log('吃只鼠鼠');
    // }
}

// 共享属性优化
// 1. 省内存
// 2. 所有实例共享prototype对象上的属性和方法
// 3. 可实例是如何共享 prototype对象上的呢？
// - this——> constructor + prototype
// 4.如何区分 对象本身的属性（constructor） 和 prototype对象上的属性？
// - API：XX.hasOwnProperty('属性名');
Cat.prototype.eat = function () {
    console.log('吃只鼠鼠');
}
Cat.prototype.type = '猫科动物';

let cat1 = new Cat('Tom', '黑色');// 内存的角度看，分配了新的内存空间
let cat2 = new Cat('中猫', '绿色');

console.log(cat1.hasOwnProperty('name'));// 属于自身constructor的属性

console.log(cat2.name, cat2.type, cat2.__proto__.type);// 首先在 ownProperties 去查找 如果有 返回，如果没有 继续去 prototype对象 上找
// 在js里，不需要去明写__proto__去调用，可以直接调用方法

console.log(cat2.toString());//toString()未声明，但是是cat2的原型对象的原型对象cat2.__proto__.__proto__自带的
console.log(cat2.__proto__.__proto__.__proto__);//原型链